﻿// -------------------------------------------------------------------------
//    @FileName         :    NFEventDisp.h
//    @Author           :    gaoyi
//    @Date             :    24-8-13
//    @Email            :    445267987@qq.com
//    @Module           :    NFEventDisp
//
// -------------------------------------------------------------------------

#pragma once


#include "NFComm/NFCore/NFPlatform.h"

namespace proto_ff
{
    class RoleMapData;
}

struct LoopQuest;
class NFGridItem;
class NFPlayer;
class NFSession;
class RoleOne;

class NFEventDisp
{
public:
    // 当玩家登录时的回调函数
    // 参数 pPlayer: 玩家对象指针
    // 参数 iIsResume: 是否恢复登录的标志
    // 返回值: 处理结果，0为成功
    static int OnPlayerLogin(NFPlayer* pPlayer, bool iIsResume);

    // 当玩家登出时的回调函数
    // 参数 pPlayer: 玩家对象指针
    // 返回值: 处理结果，0为成功
    static int OnPlayerLogout(NFPlayer* pPlayer);

    // 当玩家断开连接时的回调函数
    // 参数 pPlayer: 玩家对象指针
    // 参数 iType: 断开连接的类型
    // 参数 iReason: 断开连接的原因
    // 返回值: 处理结果，0为成功
    static int OnPlayerDisconnect(NFPlayer* pPlayer, int iType, int iReason);

    // 当玩家对象销毁时的回调函数
    // 参数 pPlayer: 玩家对象指针
    // 返回值: 处理结果，0为成功
    static int OnDestroyPlayer(NFPlayer* pPlayer);

    // 当玩家被踢下线时的回调函数
    // 参数 pPlayer: 玩家对象指针
    // 参数 iReason: 被踢下线的原因
    // 返回值: 处理结果，0为成功
    static int OnKickOff(NFPlayer* pPlayer, int iReason);

    // 当玩家角色被删除时的回调函数
    // 参数 pSession: 会话对象指针
    // 参数 pstRoleOne: 角色信息指针
    // 返回值: 处理结果，0为成功
    static int OnPlayerDelete(NFSession* pSession, RoleOne* pstRoleOne);

    // 当玩家账号被恢复时的回调函数
    // 参数 pPlayer: 玩家对象指针
    // 返回值: 处理结果，0为成功
    static int OnPlayerRestored(NFPlayer* pPlayer);

    // 处理玩家注册事件
    // 当一个玩家成功注册到服务器时，该函数会被调用
    //
    // 参数:
    //     pPlayer: 指向NFPlayer类型的指针，包含了注册玩家的信息
    //
    // 返回值:
    //     返回一个整数值，通常用于表示处理结果，如成功或失败的状态
    static int OnPlayerRegister(NFPlayer* pPlayer);

    static int OnGetPlayerSuccess(NFPlayer* pPlayer);

    static int OnPlayerOnlineTime(NFPlayer* pPlayer, int timeElapse);

public:
    // 当会话日志检查点时的回调函数
    // 参数 pSession: 会话对象指针
    // 参数 iCheckPoint: 检查点位置
    // 返回值: 处理结果，0为成功
    static int OnSessionLogCheckPoint(NFSession* pSession, int iCheckPoint);

public:
    static int OnItemChange(uint64_t uRoleID, uint32_t iItemID, int iQuality, uint64_t uuid, int64_t iAddNum, uint64_t iNewNum, int eReason, int iReasonParam, NFGridItem* obj = NULL);
    static int OnItemChange(NFPlayer* pPlayer, NFGridItem* item, int eReason, int iReasonParam = 0);
    static int OnItemDiscard(uint64_t ullRoleID, uint32_t iItemID, uint64_t iNum, int eReason, int iReasonParam);
    static int OnItemTimeout(uint64_t ullRoleID, NFGridItem* pItem, bool bIsDress = false);

public:
    static int OnAddExp(NFPlayer* pPlayer, uint64_t exp, uint32_t iOldLevel, uint64_t oldexp, int eReason, int iReasonParam);

public:
    static int OnPlayerLevelUp(NFPlayer* pPlayer, int iLevelOld);

public:
    static int OnQuestAccepted(NFPlayer* pPlayer, int iQuestID, const LoopQuest* pLoop);
    static int OnQuestGiveUp(NFPlayer* pPlayer, int iQuestID, uint32_t uAcceptTime);
    static int OnQuestDeleted(NFPlayer* pPlayer, int iQuestID, uint32_t uAcceptTime);
    static int OnQuestConditionReached(NFPlayer* pPlayer, int iQuestID);
    static int OnQuestComplete(NFPlayer* pPlayer, int iQuestID, uint32_t uAcceptTime, int iLoopQuestIndex, LoopQuest* pLoop);
    static int OnQuestSync(NFPlayer* pPlayer, int iQuestID, uint64_t iFromRoleID);

    // LoopQuest
    static int OnLoopQuestAccepted(NFPlayer* pPlayer, const LoopQuest* pLoop);
    static int OnLoopQuestGiveUp(NFPlayer* pPlayer, const LoopQuest* pLoop, int iOldQuest, uint32_t uOldQuestAcceptTime);
    static int OnLoopQuestTimeOut(NFPlayer* pPlayer, const LoopQuest* pLoop, int iOldQuest, uint32_t uOldQuestAcceptTime);
    static int OnLoopQuestDeleted(NFPlayer* pPlayer, const LoopQuest* pLoop, int iOldQuest, uint32_t uOldQuestAcceptTime);
    static int OnLoopQuestSync(NFPlayer* pPlayer, const LoopQuest* pLoop, int iOldQuestID, uint32_t uOldQuestAcceptTime, uint64_t iFromRoleID);

public:
    static int OnEnterArea(NFPlayer* pPlayer, int iMapId, int iAreaIdx);
    // 玩家移动
    static int OnPlayerMove(NFPlayer* pPlayer, const proto_ff::RoleMapData* pRoleMapData);
};
